/**
 * 
 */
package cn.biplam.common.file;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import cn.biplam.common.file.object.ObjectSerialFile;
import cn.biplam.common.wrapper.ErrorMessage;

/**
 * 对象序列化文件访问类
 * @author 	WangSong
 * @create 	2009-3-29 下午02:25:54
 * @version 1.0
 */
public class ObjectFile implements Serializable {

	/** */
	private static final long serialVersionUID = -7394534451319400240L;
	/**存储/读取的对象实例 */
	private ObjectSerialFile mObjectSerialFile=null;
	/**存储/读取的文件名 */
	private String sFileName=null;
	
	@SuppressWarnings("unused")
	private ObjectFile(){}
	
	/**
	 * 功能：构造方法	 传入一个对象初始化(适用于存储)
	 * 		默认文件名=对象类名称.obj
	 * @param obj			需要存储的对象实例
	 * @throws ErrorMessage
	 */
	public ObjectFile(Object obj) throws ErrorMessage{
		this.mObjectSerialFile=new ObjectSerialFile(obj);
		this.sFileName=this.mObjectSerialFile.getObjectName()+".obj";
	}
	
	/**
	 * 功能：构造方法 传入一个对象和文件名初始化((适用于存储))
	 * @param obj			需要存储的对象实例
	 * @param fileName		序列化文件名称(包括path)
	 * @throws ErrorMessage
	 */
	public ObjectFile(Object obj,String fileName) throws ErrorMessage{
		this.mObjectSerialFile=new ObjectSerialFile(obj);
		this.setFileName(fileName);
	}
	
	/**
	 * 功能：构造方法 传入文件名初始化(适用于读取)
	 * @param fileName
	 */
	public ObjectFile(String fileName){
		this.setFileName(fileName);
	}
	
	/**
	 * 功能 返回序列化的对象的类实例
	 * @return
	 * @throws ErrorMessage
	 */
	public Object get() throws ErrorMessage{
		if(this.mObjectSerialFile==null){
			return this.read();
		}else{
			return this.mObjectSerialFile.get();
		}
	}
	
	private Object read() throws ErrorMessage{
		ObjectInputStream in=null;
		try{
			in=new ObjectInputStream(new FileInputStream(this.sFileName));
			Object obj=in.readObject();
			in.close();
			return ((ObjectSerialFile)obj).get();
		}catch(Exception e){
			ErrorMessage eMg=new ErrorMessage(e);
			throw eMg;
		}
	}

	/**
	 * 功能：返回存储的文件名称
	 * @return
	 */
	public String getFileName() {
		return sFileName;
	}

	/**
	 * 功能：获得对象类名称
	 * @return
	 */
	public String getObjectName() {
		return this.mObjectSerialFile.getObjectName();
	}
	
	/**
	 * 功能 将对象写入到文件
	 * @throws ErrorMessage
	 */
	public void put() throws ErrorMessage{
		try{
			ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(sFileName));
			out.writeObject(this.mObjectSerialFile);
			out.close();
		}catch(Exception e){
			ErrorMessage eMg=new ErrorMessage(e);
			throw eMg;
		}
	}

	/**
	 * 功能：设置存储的文件名称
	 * @param fileName
	 */
	public void setFileName(String fileName) {
		this.sFileName = fileName;
	}
	
	/**
	 * 功能：返回存储对象的类名称
	 * @return
	 */
	public String toString(){
		return this.getObjectName();
	}
}
